/*
 * Parameter.h
 *
 *  Created on: 2011-11-07
 *      Author: czzhao
 */

#ifndef PARAMETER_H_
#define PARAMETER_H_

#include <stdint.h>
#include "Defines.h"
//#include <Message.h>

//////////////////////////////////////////////////////////////////////////////////////////////////
//Network
//////////////////////////////////////////////////////////////////////////////////////////////////
#define SUPPORT_MAX_CHANNEL_NUM HARDWARE_VIDEO_CHANNEL_NUM
#define SUPPORT_MAX_SENSOR_NUM  HARDWARE_ALARM_IN_CHANNEL_NUM
#define SUPPORT_MAX_VO_NUM	4
#define SUPPORT_IPADDR_LEN 16
#define MAX_STORAGE_DEVICE_NUM 8

#define MAX_WIFI_SAVE_AP		8

typedef struct tag_paramIpStruct{
	uint8_t szIpAddr[SUPPORT_IPADDR_LEN]; /**< IP地址 */
	uint8_t szSubnetMask[SUPPORT_IPADDR_LEN]; /**< 子网掩码 */
	uint8_t szDefaultGateway[SUPPORT_IPADDR_LEN]; /**< 网关 */
	uint8_t ucReserved[32];
} paramIpStruct_t;



typedef struct tag_paramDNSStruct{
	uint8_t szPrimaryDns[SUPPORT_IPADDR_LEN]; /**< 主DNS */
	uint8_t szAlternateDns[SUPPORT_IPADDR_LEN]; /**< 备用到DNS */
	uint8_t ucReserved[32];
} paramDNSStruct_t;



/*****************ehter network setting***********************/
typedef struct tag_EtherNetSeting{
	uint8_t cIpMode; /*IP获取方式， 0: 静态IP 1：DHCP*/
	uint8_t cDnsMode; /*是否自动获取DNS服务器 0：手动设置DNS服务器地址 1：自动获取DNS服务器地址 */
    char cReserved[2];
	paramIpStruct_t stuStaticIp;	/**< 静态IP的相关配置 */
    paramDNSStruct_t stuDNS; /**< DNS相关参数 */
    char szReserved1[32];
} paramEtherNetSetting_t;


/*****************wifi network setting***********************/
typedef enum _WifiEncrypt_{
    WE_NONE,
    WE_WEP,
    WE_WPA
}WifiEncrypt_t;

typedef struct tag_WifiSetting{
	uint8_t cEnable; /**< 是否开启WIFI 0-关闭 1-开启*/
	uint8_t cEcryptType; /**< 加密方式 0- WE_NONE, 1- WE_WEP, 2 WE_WPA */
	uint8_t cIpMode; /**< IP获取方式， 0 静态IP 1：DHCP*/
	uint8_t cDnsMode; /**< 所否自动获取DNS服务器 0：手动设置DNS服务器地址 1：自动获取DNS服务器地址 */
	char szESSID[64]; /**< ESSID */
	char szWifiPassword[32]; /**< 密码 */
	paramIpStruct_t stuStaticIp;	/**< 静态IP的相关配置 */
    paramDNSStruct_t stuDNS; /**< DNS相关参数 */
    char szReserved[32];
} paramWifiSetting_t;


typedef struct tag_WifiAPInfo{
	uint8_t cPreferred; /**< 是否是首选WIFI 0-不是 1-是*/
	uint8_t cEcryptType; /**< 加密方式 0- WE_NONE, 1- WE_WEP, 2 WE_WPA */
	uint8_t cIpMode; /**< IP获取方式， 0 静态IP 1：DHCP*/
	uint8_t cDnsMode; /**< 所否自动获取DNS服务器 0：手动设置DNS服务器地址 1：自动获取DNS服务器地址 */
	char szESSID[64]; /**< ESSID */
	char szWifiPassword[32]; /**< 密码 */
	paramIpStruct_t stuStaticIp;	/**< 静态IP的相关配置 */
    paramDNSStruct_t stuDNS; /**< DNS相关参数 */
    uint8_t ucUsed; /* 0xEE:已使用，其他:没使用 仅供Configure模块使用 */
    char szReserved[31];
} paramWifiAPInfo_t;

/*****************ADSL setting***********************/
typedef struct tag_ADSLSetting
{
	uint8_t ucEnable; /**< 是否启用ADSL 0:关闭 1：开启*/
	uint8_t ucDialDevice; /**< 拨号设备，0-ETHERNET 1-WIFI */
	char reserved[14];
	char szUserId[32]; /**< 账户 */
	char szPassword[32]; /**< 密码 */
} paramAdslSetting_t;



/*****************3G setting***********************/
typedef enum _module3Gtype_{
	MODULE3G_GPRS = 0,/**/
	MODULE3G_EDGE,
    MODULE3G_CDMA,/**/
    MODULE3G_EVDO,/**/
    MODULE3G_WCDMA,/**/
    MODULE3G_TDSCDMA,/**/
    NONE,/**/
}module3Gtype_t;

typedef struct tag_3GSetting{
	uint8_t ucEnable; /**< 是否启用3G 0:关闭 1-开启 */
	uint8_t ucNetworkType; /*网络类型,见module3Gtype_t */
    uint8_t ucActiveMode;/*网络连接模式,0--自动连接,1--手动激活(电话激活,短信激活)*/
	char reserved1;
	char szApn[32]; /**< APN */
	char szUserId[32]; /**< 账户 */
	char szPassword[32]; /**< 密码 */
	char szServerCode[32]; /**< 服务号码 */
	char reserved2[64];
} param3GSetting_t;


/*****************NTP setting***********************/
typedef struct tag_NtpSetting{
	uint8_t ucNtpSwitch;/*NTP开关*/
	uint8_t ucReserved;
	uint16_t usInternelTime;/*校时时间间隔，单位：分钟*/
    char szServerName[32];/*NTP服务器地址*/
    char cReserve2[32];
}paramNtpSetting_t;


/*****************DDNS setting***********************/
typedef enum _ddnsservertype_{
	DST_3322,/*members.3322.org*/
	DST_DYNDNS,/*members.dyndns.org*/
	DST_LTSCCTV,/*ns1.ltscctv.com*/
	DST_LOREXDDNS,/*ddns.lorexddns.net*/
	DST_DNSEXIT,  /*www.dnsexit.com*/

	DST_QSEE, /*myq-see.com*/
	DST_ANPVISION,
	DST_VISIONICA, /*dynamic.visionica.com*/

	DST_JINSANJIA,
	DST_CCTVGOV,

	DST_NIGHTOWL,/*nightowldvr.com*/
	DST_FFBBCC,
	DST_ZHIJING,
	DST_NO_IP,

    DST_USER_DEFINED,/*客户自己配置服务器，这时需要上层把服务器名和port传下来*/

	DST_CHANGEIP,
	DST_88110,
	
	DST_DDNSDVR,

	DST_ECO,

	DST_DFSEC,/*88110*/

	DST_SANLLON,/*88110*/

	DST_WISOL, /*ns1.wisol.sg*/

	DST_88110_NIGHTOWL,/*88110*/

	DST_CAMSEC,/*www.camsec.net*/

	DST_88110_REELINK,/*88110,香港服务器*/

	DST_UNKNOW

}ddnsservertype_t;

typedef struct tag_Ddnssetting_{
	uint8_t cDdnsSwitch;/*ddns开关，即是否开启DDNS功能，0表示关闭，1表示开启*/
	uint8_t cDdnsType;/*ddnsservertype_t*/
	uint16_t usPort;  /*端口，有的ddns服务器可能需要指定端口，如用udp协议实现的ddns*/
	char szServerName[32];/*服务器域名或ip地址，当cDdnsType == DST_USER_DEFINED或客戶自定义的DST_88110时，需要把servername及port传递过来*/
	char szHostName[32];/*主机名，包含字符串结束标志的ASCII字符串*/
	char szUserName[32];/*用户名，包含字符串结束标志的ASCII字符串*/
	char szUserPW[32];/*用户密码，包含字符串结束标志的ASCII字符串*/
	uint8_t c88110Default;/*ddnsservertype_t==DST_88110时有效,表示是否使用锐明自带的88110服务器, 0:客戶自建88110,要求输入iP(域名)和Port,1:默认88110服务器*/
	char cReserve2[31];
}paramDdnsSetting_t;


/*****************Email setting***********************/
typedef struct tag_EmailSetting{
	uint8_t ucEmailSwitch; /*是否开启EMAIL功能，0表示关闭，1表示开启*/
	uint8_t ucSslSwitch; /*是否开启SSL功能，0表示关闭，1表示开启*/
	uint8_t ucReserve1[2];
    char szSmtpServer[32]; /*发件箱的SMTP服务器*/
	char szSenderName[32]; /*发件人邮箱*/
	char szSenderPwd[32]; /*发件人密码*/
	uint16_t usServerPort; /*邮件服务器的端口号*/
	uint16_t usSendInterval; /*发送时间间隔*/
	char szRecvName[10][32]; /**< 收件人邮箱,下标0为收件人，其他为抄送人 */
    uint8_t usRerve2[32];
} paramEmailSetting_t;


typedef struct _uPnPPort_t
{
	unsigned short usStartPort;/*起始端口号*/
	unsigned short usEndPort; /*结束端口号*/
	char	   	   szDescript[32];/*描述字符*/
	char	   	   cReserved[32];/*预留字节*/
}uPnPPort_t;

/*****************UPNP setting***********************/
typedef struct _upnpsetting_{
	//uint16_t usStartPort;
	//uint16_t usEndPort;
	uPnPPort_t TcpPort; /*tcp port*/
	uPnPPort_t UdpPort; /**udp port*/
	char	   szInterface[32];/*网卡名称，后面可能会指定把upnp绑定到那个网卡*/
	uint8_t    ucEnable;
    char 	   reserve[15];
}paramUpnpSetting_t;



/*****************network port setting***********************/
typedef struct tag_PortSetting{
	uint16_t usPortList[8];/*0-WEB;1-媒体;*/
	uint8_t ucReserved[16];
} paramPortSetting_t;




/*****************IE client setting***********************/
typedef struct tag_IEClientSetting
{
	char cAdminPwd[8];/*管理员密码*/
	char cUserPwd[8];/*普通用户密码*/
	uint8_t ucHavePwd;/*是否使用密码，0表示不使用，1表示使用*/
	uint8_t ucPriority;/*0为画质优先(CIF 6FPS)，1为帧率优先(QCIF 25FPS)*/
	uint8_t ucReserve1[34];
}paramIEClientSetting_t;



/*****************Mobile setting*****************************/
typedef struct tag_WSMPSetting{
/*CS模式和p2p模式，该参数用于CS模式*/
    uint8_t ucServerIp[16];/*服务器IP地址*/
	uint16_t usServerPort;/*服务器端口0~65535*/
	uint8_t ucReserved[2];
    char cSerialId[32];/*序列号*/
	uint8_t ucMobileMode;/*1:主动，0:被动*/
	uint8_t ucReserved1[31];
}paramWSMPSetting;


/*****************CMS setting*****************************/
/*待定*/
typedef struct tag_CmsSetting{
	uint8_t ucCenterIp[SUPPORT_IPADDR_LEN]; /*中心IP地址*/
    uint8_t ucMediaIp[SUPPORT_IPADDR_LEN]; /*媒体IP地址*/
    uint16_t usCenterPort; /*中心端口号*/
    uint16_t usMediaPort; /*媒体端口号*/
	uint8_t ucUseCMS;/*CMS启用标示符 关闭-0 ，启用-1*/
    uint8_t ucReverse[23];
}paramCmsSetting_t;


/*****************SubStream network setting*****************************/
/*待定*/
typedef struct tag_SubStreamNetSetting_{
	uint32_t ulTotalBandwidth;/*总带宽,单位:Kbps*/
	uint8_t ucSubStreamMode;/*子码流模式,0-固定模式;1-自适应模式*/
	char reserve[11];
}paramSubStreamNetSetting_t;


//////////////////////////////////////////////////////////////////////////////////////////////////
//General
//////////////////////////////////////////////////////////////////////////////////////////////////


/****************User info setting*****************************/
/**
 * @brief 用户权限
 * */
typedef struct tag_paramUserPower{
	uint32_t uiPlayback; /**< 远程回放权限，通道按BIT位，bit0 第一通道 */
	uint32_t uiBackup; /**< 备份权限，通道按BIT位，bit0 第一通道 */
	uint32_t uiPtz; /**< 云台权限，通道按BIT位，bit0 第一通道 */
	uint32_t uiRemoteView; /**< 远程监看权限 通道按BIT位，bit0 第一通道 */
	uint32_t uiView; /**< 现场监看权限，通道按BIT位，bit0 第一通道 */
	uint32_t uiOperate; /**< 非通道权限 bit0:日志权限 bit1:重启机器 bit2:磁盘管理 bit3:设备维护 bit4:设备操作 bit5:系统设置 bit6:时间设置
								 bit7:显示设置 bit8:录像设置 bit9:网络应用 bit10:码流设置 bit11:用户设置 bit12:报警设置 bit13:网络设置 bit14:云台设置 */
	char reserved[16];
} paramUserPower_t;

typedef struct tag_oneUserInfo{
	uint8_t szUserPower[128];
	char szUserName[MAX_USER_NAME_SIZE];
	char szUserPwd[MAX_USER_PASSWD_SIZE];
	char bIsUsed; /**< 是否激活 0-否 1-是 */
	char cUserRole; /**< 角色 1 超级用户 2-管理员 3-普通用户 */
	char reserved;
	char cUseMac; /**< 是否绑定MAC地址 */
	unsigned char szMacAddr[6]; /**< 用户MAC地址，启用绑定MAC功能时生效 */
	char reserved1[10];
} paramOneUserInfo_t;


typedef struct
{
	paramOneUserInfo_t stuUserInfo[MAX_USERMANAGEMENT_NUM];
	uint8_t ucReserved[16];
} paramUserManager_t;



/****************time setting*****************************/
typedef struct {
	uint8_t ucDateMode; /**< 日期格式 0： MM/DD/YY 1： YY-MM-DD  2：DD-MM-YY */
	uint8_t ucTimeMode; /**< 时间格式 0：24小时制， 1：12小时制 */
	uint8_t ucReserved[2];
	char szTimeZone[16];
	uint32_t ulTimeOffset;/*时区偏移，最高位为符号位，1为负，0为正，存储单位为分钟*/
	struct _dst_{
		uint8_t ucSwitch; /**< 是否启用夏令时 0：否 1：是 */
		uint8_t ucDstMode; /**< 夏令时使用模式 0：默认，1：通用自定义模式 2：年月日可自定义等  */
		uint8_t ucDstTimeOffset;/*夏令时偏移时间，单位小时*/
		char cReserved[5];
		struct _defaultmode_
		{
			uint8_t ucStartMonth; /**< 起始月 0～11 */
			uint8_t ucStartWeek; /**< 起始周 高四位表示第几个星期（0：第一个星期1：第二星期 2：第三星期 4：第四星期 5：最后一星期），低四位表示星期几（0-星期日，1-6表示星期一到六）； */
			uint8_t ucEndMonth; /**< 结束月 0～11 */
			uint8_t ucEndWeek; /**< 结束周 0:第一周 5：最后一周 */
			uint8_t ucStartHour;/*开始夏令时的时*/
			uint8_t ucStartMinute;/*开始夏令时的分*/
			uint8_t ucStartSecond;/*开始夏令时的秒*/
			uint8_t ucEndHour; /*结束夏令时的时*/
			uint8_t ucEndMinute; /*结束夏令时的分*/
			uint8_t ucEndSecond; /*结束夏令时的秒*/
			uint8_t ucReserved[2];
		}stuDefaultMode;

		struct _selfdefinemode_
		{
			uint32_t ulStartTime;/*开始夏令时的年月日，UTC时间，用于自定义年月日模式*/
			uint32_t ulEndTime; /*结束夏令时的年月日，UTC时间，用于自定义年月日模式*/
		}StuSelfDefinedMode;
	} stuDst;
	char reserve1[32];
}paramTimeSetting_t;


/****************system setting*****************************/
typedef enum
{
	RT_800x600_60 = 0,
	RT_1024x768_60,
	RT_1280x1024_60,
	RT_1366x768_60,
	RT_1440x900_60,
	RT_720P60,
	RT_1080I60,
	RT_1080P60,
	RT_480P60,
	RT_576P60,

	RT_INVALID
} ResolutionTable_t;

typedef struct tag_paramVideoStandard{
	uint8_t ucVideoStandard; /*视频制式 0-PAL 1-NTSC */
}paramVideoStandard_t;


typedef struct tag_SystemSetting{
	uint8_t ucVideoStandard; /*视频制式 0-PAL 1-NTSC */
	uint8_t ucHdResolution; /*高清视频制式 见 ResolutionTable_t */
	uint8_t ucVGAResolution; /*VGA视频制式 见 ResolutionTable_t */
	uint8_t ucLangeType;/*语言类型*/
	uint32_t ucScreenSavers;/*单位秒，退出菜单时间*/
	uint32_t ulUnitID;/*本机编号，废弃*/
	uint8_t ucStartupGuide;/*开机向导, 0-disable, 1-enable*/
	uint8_t ucAudioOutputChn;/*音频输出通道号*/
	uint8_t ucVolume; /**< 音量 */
	uint8_t ucDisplayDevNo;/*1--CVBS,0--VGA,2-CVBS&VGA*/
	char cDeviceName[32];
	char szDeviceSerial[36]; /**< 设备Serial:有加密芯片, Serial为10个字节,以'\0'为结束符;
								没有加密芯片, Serial为去掉中间横杠(-)的UUID字串,32个字节,以'\0'为结束符*/
	char szDevicePwd[32];
	char szDeviceUnitID[16];/*本机编号*/
	uint8_t ucReserved[48];
}paramSystemSetting_t;



/***********************存储设备管理参数，有待讨论******************************/
typedef struct _MemoryPara_{
	unsigned char DevType;	/*设备类型, */
	unsigned char DevID;	/*设备ID*/
	unsigned char OverWrite;	/*硬盘覆盖开关状态，0-关闭,1-开启*/
	unsigned char OverType;	/*覆盖方式，0-按天覆盖，1-按容量覆盖*/
	unsigned char StorageType;	/*存储设备类型，0-正常，1-冗余，2-临时*/
	unsigned char OverValidDay;/*覆盖有效天数*/
	char Reservation[2];	/*保留字节*/
}paramMemoryPara_t;

typedef struct tag_MemoryManagePara{
	uint8_t ucMultiRecord; /*是否开启多存储设备录像,0-关闭，1-开启*/
	char cReserved0[3];	/*保留字节*/
	paramMemoryPara_t stuMemoryDev[MAX_STORAGE_DEVICE_NUM];/*0-硬盘,1-U盘,2-SD卡*/
	char cReserved1[12];	/*保留字节*/
}paramMemoryManagePara_t;


//////////////////////////////////////////////////////////////////////////////////////////////////
//Device
//////////////////////////////////////////////////////////////////////////////////////////////////

typedef struct tag_ptzSetting{
	uint8_t ucProtocol; /**< 云台协议 0:pelco-D; 1:pelco-P*/
	uint8_t ucBaudrate; /**< 波特率  0:1200;1:2400;2:4800;3:9600; */
	uint8_t ucDataBit; /**< 数据位 0:8; 1:7; 2:6; 3:5;*/
	uint8_t ucStopBit; /**< 停止位 0:1; 1:2*/
	uint8_t ucCheck; /**< 校验 1:Odd； 2:Even??； 3:Mark； 4:Space */
	uint8_t ucAddress; /**< 地址码 0～255 */
	uint8_t ucSpeed; /**< 转速 1~30 */
	uint8_t ucInfraredLight; /**< 红外灯开关 0-自动 1-常开*/
	uint8_t ucEnable;/*使能开关，1-打开，0-关闭*/
	char reserved[7];
}paramPtzSetting_t;

/*****************Ptz Cruise setting*****************************/
/*每条巡航线最多32个预置点*/
typedef struct 
{
	char cName[32];
	unsigned char ucPresetNum[32];
	unsigned char ucTime[32];
	unsigned char ucSpeed[32];
	char cReserved[32];
} paramPtzCruise_t;
/*每个通道最多4条巡航线*/
typedef struct tag_CruiseSetting
{
	paramPtzCruise_t stuCruise[4];
	char cReserved[32];
} paramPtzCruiseSetting_t;

//////////////////////////////////////////////////////////////////////////////////////////////////
//AVStream
//////////////////////////////////////////////////////////////////////////////////////////////////


/*****************Video output setting*****************************/
typedef struct
{
    uint8_t ucLeft;//左边距
    uint8_t ucRight;//右边距
    uint8_t ucTop;//上边距
    uint8_t ucBottom;//下边距
} paramScreenMargin_t;

typedef struct
{
	uint8_t szBindVoChn[32]; /*视频输出绑定通道*/
	uint32_t szPreViewEnable;/*预览使能，1bit表示一个通道，1-开启预览，0-关闭预览*/
	uint32_t ulPollingTime;/*输出轮询时间间隔，单位：秒，0表示不轮询*/
	paramScreenMargin_t stScreenMargin;
	uint8_t ucReserve[8];
} paramVideoOutput_t;/*借鉴同为*/



/*****************motion detect setting*****************************/
typedef struct
{
	uint8_t ucEnable;
	uint8_t ucSensitivity; /*移动侦测灵敏度： 8个等级，1-8由高到底(以前分为4个等级:0-高，1-较高，2-中，3:低) */
	uint8_t ucReserve[2];
	uint8_t ucRegion[32]; /**< 区域设置，180个区域，用32个字节表示，每位表示一个区域 */
	uint8_t ucReserved0[8];
} paramMotionDetect_t;


/*****************BD setting*****************************/
typedef struct
{
	uint8_t ucEnable;
	uint8_t ucReserve[3];
	struct _area_
	{
		uint16_t x;
		uint16_t y;
		uint16_t w;
		uint16_t h;
	} stuArea[4];
	uint8_t ucReserved0[4];
} paramVideoCover_t;

/*****************VideoShield setting*****************************/
typedef struct
{
	uint8_t ucEnable; /**< 所否启用遮挡 0否 1启用 */
	uint8_t ucSensitivity; /**< 灵敏度 * 0-高 1-中 2-低*/
	char reserved[6];
}paramVideoShield_t;

/*****************Videoloss setting*****************************/
typedef struct
{
	uint8_t ucEnable;
	uint8_t ucReserve[3];
} paramVideoLoss_t;



/*****************encoder setting*****************************/
typedef struct
{
	uint32_t ulBitrate; /**< 数值 */
	uint8_t ucChnEnable; /*通道使能开关,0-关闭1-开启*/
	uint8_t ucAudioEnable;/*音频编码开关,0-关闭1-开启*/
	uint8_t ucFrameRate; /**< 帧率: PAL:1~25; NTSC:1~30 */
	uint8_t ucQuality; /**< 质量： 1-优 2-良 3-好 4-中*/
	uint8_t ucResolution; /**< 分辨率 0-CIF 1-HD1 2-D1 3-QCIF 4-QVGA 5-VGA 6-720P 7-1080P 8-3MP(2048*1536) 9-5MP(2592*1920) */
	uint8_t ucBrMode; /**< CBR VBR */
	uint8_t reserve[10];
} paramVideoEncode_t;



/*****************Record setting*****************************/
typedef struct tag_RecordScheduleItem
{
	uint32_t uiStartTime;/*开始时间，小时*3600+分钟*60+秒，单位秒*/
	uint32_t uiEndTime;/*结束时间，小时*3600+分钟*60+秒，单位秒*/
	uint8_t ucRecodeType;/*录像类型 0-常规录像 1-报警录像 */
	uint8_t ucReserved[7];
} paramRecordScheduleItem;

#define MAX_RECSCHEITEM_NUM 16
typedef struct tag_RecordSchedule{/*每个条目对应两个时间段*/
  paramRecordScheduleItem stuRecScheduleItems[7][MAX_RECSCHEITEM_NUM];
    /*0:星期日1:星期一2:星期二3:星期三4:星期四5:星期五6:星期六*/
    uint8_t ucReserved[14];
}paramRecordSchedule_t;


typedef struct tag_RecordPara{
	uint8_t ucEnable;	/*录像开关状态: 0-关闭（手动）; 1-开启 */
	uint8_t ucFileType; /*录像格式: 0-锐明特殊文件系统支持的录像文件(目前仅采用该格式);1-AVI */
	uint8_t ucRecordMode; /*录像模式: 0-开机录像;1-计划录像(计划详情存于RecordPlan中) */
	uint8_t ucIsAudio; /*所否录音频 */
	uint8_t ucManualRecStatus;/*记录上次关机手动录像是否开启，0-关闭，1-开启*/
	uint8_t ucReserved0[3];
	paramRecordSchedule_t stuRecordSchedule;/*录像计划*/
	char cReserved[8];
}paramRecordMode_t;


/*****************Video image setting*****************************/
typedef struct
{
	uint8_t ucChromaticity; /*色度 */
	uint8_t ucLuminosity; /*亮度 */
	uint8_t ucContrast; /*对比度 */
	uint8_t ucSaturation; /*饱和度 */
	uint8_t ucSharpness;/*锐化值*/
	uint8_t bIsFlip; /*是否上下反转 */
	uint8_t bIsMirror; /*是否镜像 */
	uint8_t ucLightFrequency; /*灯光频率 only is 50:50hz, 60:60hz */
	uint8_t cReserved[8];
} paramVideoImage_t;


/*****************Osd insert setting*****************************/
typedef struct
{
	uint8_t ucEnableTime;/**/
	uint8_t ucEnableChName;
	uint8_t ucReserve[2];
	uint16_t usTimeX;
	uint16_t usTimeY;
	uint16_t usChNameX;
	uint16_t usChNameY;
	char szChnName[MAX_OSD_NAME_SIZE];
	uint8_t cReserved[8];
} paramVideoEncoderOsd_t;



//////////////////////////////////////////////////////////////////////////////////////////////////
//Alarm
//////////////////////////////////////////////////////////////////////////////////////////////////

/**************************蜂鸣器***********************************/
typedef struct tag_alarmproBuzzer{
	uint16_t usBuzzerTime; /*蜂鸣器鸣叫时间，单位：秒，范围:0~200,即 0:关闭;255:永远 */
	char reserved[2];
}alarmProBuzzer_t;


/**************************IO输出***********************************/
typedef struct tag_alarmProSensor{
	uint16_t usSensorOutTime; /*传感器输出时间, 单位：秒，范围:0~200,即 0:关闭;0xff:永远  */
	uint8_t ucSensorOutId; /*传感器输出关联ID，即关联到哪几个ID，按BIT位，bit0=1为第一个*/
	uint8_t ucSensorNcNo; /*输出高低电平，0-低 1-高 */
	char reserved[4];
}alarmProSensor_t;


/**************************发送邮件***********************************/
typedef struct tag_alarmProEmail{
	uint8_t bIsSendEmail; /**< 报警时，所否发送邮件，0:否;1:是 */
	char reserved[3];
}alarmProEmail_t;

/**************************录像***********************************/
typedef struct tag_alarmProRecord{
	uint32_t ulChannel; /**< 联动的通道,bit位表示，bit0-通道0 */
	uint16_t ucPreRecordSec; /**< 预录时间 单位秒 0~10 */
	uint16_t ucDelayRecordSec; /**< 录像延时 单位 秒 */
	char cReserved[8];
}alarmProRecord_t;


/**************************云台***********************************/
typedef struct tag_alarmProPtz{
	uint8_t ucType; /**< 0-联动预置，1-联动巡航线 0xff:无效*/
	uint8_t ucValue;	/**< 报警时调用云台预置点，取值：1~255;若联动巡航线，则为巡航线编号 */
	char reserved[6];
}alarmProPtz_t;


/**************************通道全屏***********************************/
typedef struct tag_alarmProFullScream{
	uint8_t ucChl;
	char reserved[3];
}alarmProFullScream;
/**************************报警连续抓拍***********************************/
typedef struct tag_alarmProSnapShot{
	uint32_t uiChl;
	char reserved[8];
}alarmProSnapShot;

/**************************报警联动业务***********************************/
typedef struct tag_alarmProcess{
	alarmProBuzzer_t stuBuzzer; /*蜂鸣器） */
	alarmProSensor_t stuSensor;/*sensor处理*/
	alarmProEmail_t stuEmail;/*email*/
	alarmProRecord_t stuRecord;/*报警联动录像处理*/
	alarmProFullScream stuFullScream; /*报警联动预览全屏处理 */
	alarmProPtz_t stuPtz[SUPPORT_MAX_CHANNEL_NUM]; /*报警联动云台处理*/
	alarmProSnapShot stuSnalpShot;/*报警联动通道连续抓拍*/
	uint8_t ucPushSwitch;/*0-关闭；1-打开*/
	char reserved[127];
}alarmProcess_t;


/**************************报警计划***********************************/
typedef struct tag_paramAlarmPlanItem
{
	uint32_t uiStartTime;/*开始时间，小时*3600+分钟*60+秒，单位秒*/
	uint32_t uiEndTime;/*结束时间，小时*3600+分钟*60+秒，单位秒*/
	uint8_t ucReserved[8];
} paramAlarmPlanItem;

#define MAX_ALARM_PLAN_ITEM MAX_RECSCHEITEM_NUM
typedef struct tag_paramAlarmPlan{/*每个条目对应两个时间段*/
	paramAlarmPlanItem stuAlarmPlanItem[7][MAX_ALARM_PLAN_ITEM];
    /*0:星期日1:星期一2:星期二3:星期三4:星期四5:星期五6:星期六*/
  uint8_t ucReserved[14];
}alarmPlan_t;




/**************************IO报警设置***********************************/
typedef struct tag_paramIOAlarmSet{
	uint8_t ucEnable; /**< 报警状态 0-禁用 1-启用 */
	uint8_t ucLevel; /**< 0-常开 1-常闭 */
	char cReserved0[6];
	char szIOName[MAX_OSD_NAME_SIZE]; /**< 名称 eg: Sensor1 */
	char szIOShort[MAX_OSD_NAME_SIZE]; /*缩写 */
	alarmPlan_t stuPlan; /**< 计划 */
	alarmProcess_t stuProcess;
	char cReserved1[32];
}paramIOAlarmSet_t;


/**
 * @brief 移动侦测报警处理参数
 * */
typedef struct tag_paramMdAlarmSet{

	alarmPlan_t stuPlan; /*计划 */
	alarmProcess_t stuProcess;
	char cReserved[32];
}paramMDAlarmSet_t;

/**
 * @brief 视频丢失报警配置
 * */
typedef struct tag_paramVideoLostAlarmSet
{
	alarmProcess_t stuProcess; /*报警处理 */
	char cReserved[32];
}paramVideoLostAlarmSet_t;

/**
 * @brief 视频遮挡报警配置
 * */
typedef struct tag_paramVideoShieldAlarmSet
{
	alarmPlan_t stuPlan; /*计划 */
	alarmProcess_t stuProcess; /*报警处理 */
	char cReserved[32];
}paramVideoShieldAlarmSet_t;

/**
 * @brief 硬盘报警
 * */
typedef struct tag_paramHddAlarmSet{
	uint8_t bIsInvalidAlarm; /**< 硬盘无效是否报警 */
	uint8_t bIsHddFullAlarm; /**< 硬盘满是否报警 */
	char reserved[2];
	alarmProcess_t stuProcess; /**< 报警处理 */
	char cReserved[32];
}paramHddAlarmSet_t;

/**
 * @brief IP地址冲突
 * */
typedef struct tag_paramIpConflictAlarm{
	uint8_t ucIsIpConflictAlarm; /**< IP冲突是否启用报警 0:关闭 1:开启 */
	char reserved[3];
	alarmProcess_t stuProcess; /**< 报警处理 */
	char cReserved[32];
}paramIPConflictAlarm;

/**
 * @brief 自动维护
 * */
typedef struct tag_paramDeviceMaintain{
	uint8_t ucMaintainMode; /**< 0:从不(never)  1:每月 2:每周  3:每天*/
	uint8_t ucMaintainDay; /**< 当ucMaintainMode为1或2时有效，当每周时，表示星期（0为星期天） ，当每月时，为日期（1为1号） */
	uint8_t ucMaintainHour; /**< 维护时间：时 */
	uint8_t ucMaintainMin; /**< 维护时间：分 */
	unsigned char reserve[28];
} paramDeviceMaintain_t;
typedef struct _keyparameter_{
	uint8_t ucMacAddr[6];
	uint8_t ucReserved[118];
}paramKeySetting_t;


/**
 * @brief 抓拍参数定义
 * */
/*手动预案抓拍是指，用户点击相应抓拍按钮时，系统根据预先设定的手动抓拍参数进行抓拍操作，该预案存于系统参数中，结构体定义如下。
	PreTime 预抓拍时间。如果系统支持预抓拍，该字段表示据当前多长时间进行抓拍操作，单位秒。目前暂不支持。
	Interval 抓拍时间间隔。当在一段时间内进行抓拍动作时，该值表示两次抓拍的时间间隔，单位秒。
	Number一次抓拍动作所抓图片数。一次抓拍多张图片时，每张图片的时间间隔由抓拍模块根据芯片新能自己调节。
	Duration抓拍持续时间。单位秒。该值如果小于interval为单次抓拍。
	User抓拍图片用途。是用比特位表示，bit0表示用于发送邮件、bit1表示用于ftp上传、bit2表示本地存储。
	Channel抓拍通道。使用比特位表示。*/
typedef struct _ManualSnapPara_{
	uint16_t PreTime;
	uint16_t Interval;
	uint16_t Number;
	uint8_t Reserved0[2];
	uint32_t Duration;
	uint32_t User;
	uint32_t Channel;
	uint8_t Reserved[32];
}ManualSnapPara_t;


/*	定时抓拍参数结构体定义如下:
	Switch 事件抓拍开关。1-开启，0-关闭。
	StartHour、StartMinute、StartSecond 开始抓拍时间。
	Interval 抓拍时间间隔。当在一段时间内进行抓拍动作时，该值表示两次抓拍的时间间隔，单位秒。
	Number一次抓拍动作所抓图片数。一次抓拍多张图片时，每张图片的时间间隔由抓拍模块根据芯片新能自己调节。
	Duration抓拍持续时间。单位秒。该值如果小于interval为单次抓拍。
	User抓拍图片用途。是用比特位表示，bit0表示用于发送邮件、bit1表示用于ftp上传、bit2表示本地存储。
	Channel抓拍通道。使用比特位表示。
	定时抓拍参数目前对每一天都生效，不针对某个特殊的日期。
*/
typedef struct _TimeSnapPara_{
	uint8_t Switch;
	uint8_t StartHour;
	uint8_t StartMinute;
	uint8_t StartSecond;
	uint16_t Interval;
	uint16_t Number;
	uint32_t Duration;
	uint32_t User;
	uint32_t Channel;
	uint8_t Reserved[32];
}TimeSnapPara_t;


/*	事件抓拍参数结构体定义如下:
	Switch 事件抓拍开关。1-开启，0-关闭。
	PreTime 预抓拍时间。如果系统支持预抓拍，该字段表示据当前多长时间进行抓拍操作，单位秒。目前暂不支持。
	Interval 抓拍时间间隔。当在一段时间内进行抓拍动作时，该值表示两次抓拍的时间间隔，单位秒。
	Number一次抓拍动作所抓图片数。一次抓拍多张图片时，每张图片的时间间隔由抓拍模块根据芯片新能自己调节。
	SnapMode 抓拍持续时间模式。当该值为0时，表示抓拍以报警开始时持续Duration秒；该值为1时，表示抓拍从报警开始到结束后再持续Duration秒。
	Duration抓拍持续时间。单位秒。具体含义见SnapMode 解释。
	User抓拍图片用途。是用比特位表示，bit0表示用于发送邮件、bit1表示用于ftp上传、bit2表示本地存储。
	Channel抓拍通道。使用比特位表示。
*/
typedef struct _EventSnapPara_{
	uint16_t PreTime;
	uint16_t Interval;
	uint16_t Number;
	uint8_t Switch;
	uint8_t SnapMode; 
	uint32_t Duration;
	uint32_t User;
	uint32_t Channel;
	uint8_t Reserved[32];
}EventSnapPara_t;

/**
 * @brief 抓拍参数定义
 * */
typedef struct _SnapPara_{
	ManualSnapPara_t stuManualSnapPara;/*手动抓拍*/
	TimeSnapPara_t stuTimeSnapPara[4];/*定时抓拍*/
	EventSnapPara_t stuEventSnapPara;/*事件抓拍*/
	uint8_t Reserved[32];
}paramSnapPara_t;


/*****************Auto sequence setting*****************************/
typedef struct 
{
	uint8_t ucMode;/*视频输出模式，0表示1x1单画面模式，1表示2x2四画面模式，2表示3x3九画面模式，3表示4x4十六画面模式，*/
	uint16_t ucDwellTime; /*当前轮巡输出持续时间*/
	uint8_t ucReserve[1];
	unsigned char Channel[32]; /*轮巡视频输出通道，数组下标表示顺序号，值0xff表示无效，值0表示none，1表示1通道，2表示2通道...*/
}paramAutoSeqSetting_t;

typedef struct 
{
	uint8_t ucAutoSeqNum;/*轮巡有效数*/
	uint8_t ucAutoSeqMode;/*轮巡模式，0表示单画面模板，1表示四画面模板，2表示八画面模板，3表示十六画面模板，4表示用户自定义*/
	uint8_t ucReserve0[6];
	paramAutoSeqSetting_t AutoSequenceSet[32];
	uint8_t ucReserve1[32];
}paramAutoSequence_t;


/**
 * @brief 通道与摄像头映射表
 * */
typedef struct
{
	char ChtoCameraNum[32];	/*通道对应的摄像头序号，数组下标表示通道号，值(0 ~ 31)表示摄像头序号*/
	uint8_t ucReserve1[32];
}paramChtoCameraNum_t;

//////////////////////////////////////////////////////////////////////////////////////////////////
//Business Special Parmeter Define
//////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct _AgentSetting_ {
	char ServerAddr[32];//三利平台的IP地址或域名
	uint32_t port;//端口 目前固定为5901
	char SerialNumber[13];//序列号
	uint8_t bEnalble;//运行状态 0:Disable 1:Enable
	char reseved[16];
} paramAgentSetting_t;

typedef struct tag_paraCameraAttribute{
	uint8_t u8WhiteBlance; /**< 白平衡（情景模式） 0-自动 1-室内 2-室外 */
	uint8_t u8DayNight; /**< 日夜模式， 0-自动 1-夜模式 2-日模式 */
	uint8_t u8ExposureMode; /**< 曝光模式 0-自动 1-手动 2-手动_1/50 3-手动_1/120 4-手动_1/250 5-手动_1/500 6-手动_1/1000 7-手动_1/2000 8-手动_1/4000 9-手动_1/10000 20-自定义区间 21-自定义值 */
	uint8_t u8ExposureValue; /**< 曝光时间，单位毫秒，当 u8ExposureMode=21时有效*/
	uint8_t u8ExposureMin; /**< 曝光时间区间最小值 当u8ExposureMode=20时有效 */
	uint8_t u8ExposureMax; /**< 曝光时间区间最大值 */
	uint8_t u8LightFrequency; /**< 防闪烁  1-50HZ 2-60HZ (3-室外) */
	uint8_t u8BackLight; /**< 背光补偿 0-关闭 1-开起 */
	uint8_t u8BackLightValue; /**< 补偿值【0-63】 */
	uint8_t u8GainMode; /**< 增益模式 */
	uint8_t u8GainValue; /**< 增益上限 */
	uint8_t u8Mirror; /**< 镜像：0-关闭 1-开启 */
	uint8_t u8Flip; /**< 翻转 0-关闭 1-开启 */
	uint8_t u8AutoIris; /**< 自动光圈 0-关闭 1-开启 */
	char reserved[18];
} paramCameraAttribute_t;

typedef struct _CustomAttrSetting_ {
	char szContentItems[2][64];/*客户条目信息*/
	char reseved[128];
} paramCustomAttrSetting_t;

//////////////////////////////////////////////////////////////////////////////////////////////////
//Customer Special Business Parmeter Define
//////////////////////////////////////////////////////////////////////////////////////////////////
typedef enum
{
	CSST_SCC21USER,
	CSST_INVALID
}eCustomSpecialSetType;

typedef struct _Scc21User_{
    char szUserName[32];/**用户名**/
    char szUserPwd[32];/**用户密码**/
    char szHostName[32];/**主机名**/
    char szLanPwd[32];/*网络密码*/
    char cReserve[64];
}ParamScc21User_t;


typedef struct _CustomSpecialSetting_
{
	uint8_t CustomType;/*具体定义见eCustomSpecialSetType的定义*/
	uint8_t Reserved[3];
	union{
		uint8_t Reserverd[1024];
		ParamScc21User_t stuScc21User;/*对应CSST_SCC21USER*/
	};
}paramCustomSpecialSetting_t;

//////////////////////////////////////////////////////////////////////////////////////////////////
//WholeSetting
//////////////////////////////////////////////////////////////////////////////////////////////////

#define FLASH_PARAM_CHECK_MAGIC 0x12345675
//#define FLASH_PARAM_CHECK_MAGIC 0x12345676
typedef struct
{
	int32_t Magic;
	uint32_t ulCRC32Value;
	uint32_t ulEraseCounts;
	int8_t cSettingsBody[0];
	paramKeySetting_t stuKeyParamSet;
	paramUserManager_t stuUserManage;
	paramTimeSetting_t stuTimeSet;
	paramSystemSetting_t stuSystemSet;
	paramDeviceMaintain_t stuDeviceMaintain;
	paramEtherNetSetting_t stuEtherNet;
	paramWifiSetting_t stuWifi;
	paramAdslSetting_t stuAdsl;
	param3GSetting_t stu3G;
	paramNtpSetting_t stuNtp;
	paramDdnsSetting_t stuDdns;
	paramEmailSetting_t stuEmail;
	paramUpnpSetting_t stuUpnp;
	paramIEClientSetting_t stuIEClient;
	paramSubStreamNetSetting_t stuSubStreamNet;
	paramPortSetting_t stuNetPortSet;
	paramMemoryManagePara_t stuMemoryParam;
	paramPtzSetting_t stuPtz[SUPPORT_MAX_CHANNEL_NUM];
	paramPtzCruiseSetting_t stuPtzCuriseSet[SUPPORT_MAX_CHANNEL_NUM];

	paramVideoOutput_t stuVideoOutput[SUPPORT_MAX_VO_NUM];
	paramRecordMode_t stuRecordMode[SUPPORT_MAX_CHANNEL_NUM];
	paramVideoEncode_t stuMainStream[SUPPORT_MAX_CHANNEL_NUM]; /*主码流 */
	paramVideoEncode_t stuSubStream[SUPPORT_MAX_CHANNEL_NUM]; /*子码流*/
	paramVideoEncode_t stuMobileStream[SUPPORT_MAX_CHANNEL_NUM]; /*子码流*/
	paramMotionDetect_t stuMotionDectect[SUPPORT_MAX_CHANNEL_NUM]; /*移动侦测 */
	paramVideoCover_t stuVideoCover[SUPPORT_MAX_CHANNEL_NUM]; /*遮挡*/
	paramVideoShield_t stuVideoShield[SUPPORT_MAX_CHANNEL_NUM]; /*视频遮挡*/
	paramVideoLoss_t stuVideoLoss[SUPPORT_MAX_CHANNEL_NUM];/*视频丢失*/

	paramVideoImage_t stuVideoImage[SUPPORT_MAX_CHANNEL_NUM]; /**< 视频图像参数 */
	paramVideoEncoderOsd_t stuVideoOsd[SUPPORT_MAX_CHANNEL_NUM];
	paramIOAlarmSet_t stuIoAlarmSetting[SUPPORT_MAX_SENSOR_NUM]; /*IO输入报警配置 */
	paramMDAlarmSet_t stuMdAlarmSetting[SUPPORT_MAX_CHANNEL_NUM]; /*移动侦测报警参数 */
	paramVideoLostAlarmSet_t stuVideLostAlarm[SUPPORT_MAX_CHANNEL_NUM]; /*视频丢失报警参数 */
	paramVideoShieldAlarmSet_t stuShieldAlarm[SUPPORT_MAX_CHANNEL_NUM]; /*遮挡报警参数 */
	paramHddAlarmSet_t stuHddAlarm; /**< 硬盘报警参数 */
	paramIPConflictAlarm stuIPConflictAlarm; /**< IP地址冲突报警配置 */

	/**
	 * @brief 新增参数需再uiCrcLen后添加
	 * 当对于此方式之前的参数，uiCrcLen为预留字节，值为0，根据此条件，CRC长度为1024;
	 * 对于此方式之后的参数，保持时，需要给uiCrcLen赋值为 stSettings的从cSettingsBody到结束的长度
	 * 新增加的参数一定要再reserved中添加加，并且需再reserved减少增加的字节
	 * */
	uint32_t uiCrcLen; /**< 参数中计算CRC的长度,赋值时为cSettingsBody 到(stSettings)结束的长度，先赋值再计算CRC */
	paramSnapPara_t stuSnapPara;/**< 抓拍参数配置*/
	paramAgentSetting_t stuAgentSetting; /**< Business Special Parmeter Define */
	paramAutoSequence_t stuAutoSequence;/**<轮询参数配置*/
	paramCameraAttribute_t stuCameraAttribute[SUPPORT_MAX_CHANNEL_NUM]; /**< 摄像头属性 */
	paramCustomAttrSetting_t stuCustomAttr;/*客户属性信息*/
	paramCmsSetting_t stuCmsSetting;/*CMS设置参数*/
	paramChtoCameraNum_t stuChToCameraNum;/*通道与摄像头映射表*/
	paramAutoSequence_t stuSpotSequence;/**<Spot轮询参数配置*/
	paramWifiAPInfo_t stuWifiAPInfo[MAX_WIFI_SAVE_AP];/**<wifi 保存用户配置过的AP的信息*/
	paramCustomSpecialSetting_t stuCustomSpecialSetting;/*客户特殊需求配置参数*/
	char reserved[608]; //sizeof(uiCrcLen)+sizeof(stuSnapPara)+sizeof(stuAgentSetting) = 416, 1024-416=608
} stSettings;




#endif /* PARAMETER_H_ */
